﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Caching;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication3
{
    public partial class NewDefault : System.Web.UI.Page
    {
        Random random = new Random(DateTime.Now.Millisecond);

        string CANDIDATI_SESSION = "candidati-sessione";
        string CANDIDATI_CACHE = "candidati-cache";
        string GIAVOTATO_SESSION = "giavotato-session";

        List<Table> _candidati = null;
        List<Table> Candidati
        {
            get
            {
                if (_candidati == null)
                {
                    _candidati = (List<Table>)HttpContext.Current.Cache.Get(CANDIDATI_CACHE);

                    if (_candidati == null)
                    {
                        using (DataClasses1DataContext ctx = new DataClasses1DataContext())
                        {
                            _candidati = ctx.Tables.ToList();

                            HttpContext.Current.Cache.Add(CANDIDATI_CACHE, _candidati, null, DateTime.Now.AddSeconds(60), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
                        }
                    }
                }

                return _candidati;
            }
        }

        List<Table> _sessionCandidati = null;
        List<Table> SessionCandidati
        {
            get
            {
                _sessionCandidati = (List<Table>)Session[CANDIDATI_SESSION];
                if (_sessionCandidati == null)
                {
                    _sessionCandidati = new List<Table>();
                    foreach (var item in Candidati)
                    {
                        _sessionCandidati.Add(item);
                    }
                }
                Session.Add(CANDIDATI_SESSION, _sessionCandidati);
                return _sessionCandidati;
            }
        }

        bool GiaVotato
        {
            get
            {
                if (Session[GIAVOTATO_SESSION] != null)
                {
                    return (bool)Session[GIAVOTATO_SESSION];
                }
                else
                {
                    return false;
                }
            }
            set
            {
                Session[GIAVOTATO_SESSION] = value;
            }
        }

        //public int ProgressBarValue
        //{
        //    get
        //    {
        //        float ratio = (float)(Candidati.Count - SessionCandidati.Count) / Candidati.Count;
        //        return (int)(100 * ratio);
        //    }
        //}

        public int CandidatiRimasti
        {
            get
            {
                return SessionCandidati.Count + 1;
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                Initialize();

                if (Candidati.Count > 2)
                {
                    string nome = GetCandidateFromSessionList();
                    SetImage(nome, imgBtnCandidatoLeft, litNomeLeft);
                    nome = GetCandidateFromSessionList();
                    SetImage(nome, imgBtnCandidatoRight, litNomeRight);
                }

                candidati.Visible = true;
                vincitore.Visible = false;
            }
        }

        private void Initialize()
        {
            Session.Remove(CANDIDATI_SESSION);
            Session.Remove(GIAVOTATO_SESSION);
        }

        protected void imgBtnCandidatoLeft_Click(object sender, ImageClickEventArgs e)
        {
            if (HasMoreCandidati())
            {
                string nome = GetCandidateFromSessionList();
                SetImage(nome, imgBtnCandidatoRight, litNomeRight);
            }
            else
            {
                SetWinner(imgBtnCandidatoLeft.ToolTip);
            }
        }

        protected void imgBtnCandidatoRight_Click(object sender, ImageClickEventArgs e)
        {
            if (HasMoreCandidati())
            {
                string nome = GetCandidateFromSessionList();
                SetImage(nome, imgBtnCandidatoLeft, litNomeLeft);
            }
            else
            {
                SetWinner(imgBtnCandidatoRight.ToolTip);
            }
        }

        protected void btnSuggerimento_Click(object sender, EventArgs e)
        {

        }

        private void SetWinner(string nome)
        {
            if (!GiaVotato)
            {
                int preferenze = 0;
                using (DataClasses1DataContext ctx = new DataClasses1DataContext())
                {
                    var winner = ctx.Tables.FirstOrDefault(c => c.nome == nome);
                    winner.preferenze++;
                    preferenze = winner.preferenze;
                    ctx.SubmitChanges();
                }

                vincitore.Visible = true;
                candidati.Visible = false;

                imgVincitore.ImageUrl = "Images/Candidati/" + nome + ".jpg";
                litVincitore.Text = nome;
                litPreferenze.Text = preferenze.ToString();
                GiaVotato = true;
            }
        }

        private void SetImage(string nome, ImageButton imgBtn, Literal litNome)
        {
            imgBtn.ImageUrl = "Images/Candidati/" + nome + ".jpg";
            litNome.Text = imgBtn.ToolTip = nome;
        }

        private string GetCandidateFromSessionList()
        {
            string nome = null;

            int max = SessionCandidati.Count;
            int index = random.Next(max);
            nome = SessionCandidati[index].nome;
            SessionCandidati.RemoveAt(index);

            return nome;
        }

        private bool HasMoreCandidati()
        {
            return SessionCandidati.Count > 0;
        }

        protected void btnWinnerLeft_Click(object sender, EventArgs e)
        {
            SetWinner(imgBtnCandidatoLeft.ToolTip);
        }

        protected void btnWinnerRight_Click(object sender, EventArgs e)
        {
            SetWinner(imgBtnCandidatoRight.ToolTip);
        }
    }
}